﻿/*-------------------------------------------------------------------------
* CLR版本:     4.0.30319.42000
* 创建人:      song 
* 创建时间：   2024/4/9 10:52:28
* 功 能：      Tick托管 使用接口方便 进行性能分析
*-------------------------------------------------------------------------*/

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Profiling;

namespace SCore.Util
{
    public interface IUpdatable
    {
        void SUpdate(float dt);
    }

    public interface IFixUpdatable
    {
        void SFixUpdate(float dt);
    }

    public interface ILateUpdatable
    {
        void SLateUpdate(float dt);
    }

    public class UnityUpdate : MonoSingleton<UnityUpdate>
    {
        private bool _profile = true;

        public readonly List<IUpdatable> _updaters = new List<IUpdatable>();
        public readonly List<IFixUpdatable> _fixUpdaters = new List<IFixUpdatable>();
        public readonly List<ILateUpdatable> _lateUpdaters = new List<ILateUpdatable>();


        void Update()
        {
            float dt = Time.deltaTime;
            for (int i = 0; i < _updaters.Count; ++i)
            {
                if (_profile)
                {
                    TimeTest.Start($"UnityUpdate.Update.{_updaters[i].GetType().Name}", true);
                    Profiler.BeginSample($"UnityUpdate.Update.{_updaters[i].GetType().Name}");
                }

                _updaters[i].SUpdate(dt);
                if (_profile)
                {
                    Profiler.EndSample();
                    TimeTest.End();
                }
            }
        }

        public void Register(IUpdatable updatable)
        {
            if (!_updaters.Contains(updatable))
            {
                _updaters.Add(updatable);
            }
            else
            {
                $"[RegisterUpdate] {updatable.GetType().Name} 重复注册".Warn();
            }
        }

        public void UnRegister(IUpdatable updatable)
        {
            if (_updaters.Contains(updatable))
            {
                _updaters.Remove(updatable);
            }
        }


        void FixUpdate()
        {
            float dt = Time.fixedDeltaTime;
            for (int i = 0; i < _fixUpdaters.Count; ++i)
            {
                if (_profile)
                {
                    TimeTest.Start($"UnityUpdate.FixUpdate.{_fixUpdaters[i].GetType().Name}", true);
                    Profiler.BeginSample($"UnityUpdate.FixUpdate.{_fixUpdaters[i].GetType().Name}");
                }

                _fixUpdaters[i].SFixUpdate(dt);
                if (_profile)
                {
                    Profiler.EndSample();
                    TimeTest.End();
                }
            }
        }

        public void Register(IFixUpdatable updatable)
        {
            if (!_fixUpdaters.Contains(updatable))
            {
                _fixUpdaters.Add(updatable);
            }
            else
            {
                $"[RegisterUpdate] {updatable.GetType().Name} 重复注册".Warn();
            }
        }

        public void UnRegister(IFixUpdatable updatable)
        {
            if (_fixUpdaters.Contains(updatable))
            {
                _fixUpdaters.Remove(updatable);
            }
        }


        void LateUpdate()
        {
            float dt = Time.deltaTime;
            for (int i = 0; i < _lateUpdaters.Count; ++i)
            {
                if (_profile)
                {
                    TimeTest.Start($"UnityUpdate.LateUpdate.{_lateUpdaters[i].GetType().Name}", true);
                    Profiler.BeginSample($"UnityUpdate.LateUpdate.{_lateUpdaters[i].GetType().Name}");
                }

                _lateUpdaters[i].SLateUpdate(dt);
                if (_profile)
                {
                    Profiler.EndSample();
                    TimeTest.End();
                }
            }
        }

        public void Register(ILateUpdatable updatable)
        {
            if (!_lateUpdaters.Contains(updatable))
            {
                _lateUpdaters.Add(updatable);
            }
            else
            {
                $"[RegisterUpdate] {updatable.GetType().Name} 重复注册".Warn();
            }
        }

        public void UnRegister(ILateUpdatable updatable)
        {
            if (_lateUpdaters.Contains(updatable))
            {
                _lateUpdaters.Remove(updatable);
            }
        }


        public void Profile(bool profile)
        {
            this._profile = profile;
        }
    }
}